{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 48,
   "metadata": {},
   "outputs": [],
   "source": [
    "import tensorflow as tf"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "metadata": {},
   "outputs": [],
   "source": [
    "tf.reset_default_graph()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Phase 1: assemble a graph"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(u'a:0', <tf.Tensor 'a:0' shape=() dtype=int32>)\n",
      "(u'b:0', <tf.Tensor 'b:0' shape=() dtype=int32>)\n",
      "(u'add:0', <tf.Tensor 'add:0' shape=() dtype=int32>)\n"
     ]
    }
   ],
   "source": [
    "g = tf.Graph()\n",
    "with g.as_default():\n",
    "    a = tf.constant(2,name='a')\n",
    "    print(a.name,a)\n",
    "    b = tf.constant(3,name='b')\n",
    "    print(b.name,b)    \n",
    "    x = tf.add(a,b,name='add')\n",
    "    print(x.name,x)\n",
    "    "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Write the graph defination to disk"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "node {\n",
      "  name: \"a\"\n",
      "  op: \"Const\"\n",
      "  attr {\n",
      "    key: \"dtype\"\n",
      "    value {\n",
      "      type: DT_INT32\n",
      "    }\n",
      "  }\n",
      "  attr {\n",
      "    key: \"value\"\n",
      "    value {\n",
      "      tensor {\n",
      "        dtype: DT_INT32\n",
      "        tensor_shape {\n",
      "        }\n",
      "        int_val: 2\n",
      "      }\n",
      "    }\n",
      "  }\n",
      "}\n",
      "node {\n",
      "  name: \"b\"\n",
      "  op: \"Const\"\n",
      "  attr {\n",
      "    key: \"dtype\"\n",
      "    value {\n",
      "      type: DT_INT32\n",
      "    }\n",
      "  }\n",
      "  attr {\n",
      "    key: \"value\"\n",
      "    value {\n",
      "      tensor {\n",
      "        dtype: DT_INT32\n",
      "        tensor_shape {\n",
      "        }\n",
      "        int_val: 3\n",
      "      }\n",
      "    }\n",
      "  }\n",
      "}\n",
      "node {\n",
      "  name: \"add\"\n",
      "  op: \"Add\"\n",
      "  input: \"a\"\n",
      "  input: \"b\"\n",
      "  attr {\n",
      "    key: \"T\"\n",
      "    value {\n",
      "      type: DT_INT32\n",
      "    }\n",
      "  }\n",
      "}\n",
      "versions {\n",
      "  producer: 22\n",
      "}\n",
      "\n"
     ]
    }
   ],
   "source": [
    "# write the graph definiation to disk\n",
    "writer = tf.summary.FileWriter('./graphs_add',g)\n",
    "print(g.as_graph_def())\n",
    "writer.close()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# You can visualize the graph in tensorboard\n",
    "``` tensorboard --logdir graphs_add```"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<IPython.core.display.Image object>"
      ]
     },
     "execution_count": 52,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from IPython.display import Image\n",
    "Image(filename='graphs_add.png')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[<tf.Tensor 'a:0' shape=() dtype=int32>, <tf.Tensor 'b:0' shape=() dtype=int32>, <tf.Tensor 'add:0' shape=() dtype=int32>]\n"
     ]
    }
   ],
   "source": [
    "print(tf.contrib.graph_editor.get_tensors(g))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#our node do not append to default graph\n",
    "\n",
    "```tf.reset_default_graph()``` do not work!"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 68,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "node {\n",
      "  name: \"a\"\n",
      "  op: \"Placeholder\"\n",
      "  attr {\n",
      "    key: \"dtype\"\n",
      "    value {\n",
      "      type: DT_FLOAT\n",
      "    }\n",
      "  }\n",
      "  attr {\n",
      "    key: \"shape\"\n",
      "    value {\n",
      "      shape {\n",
      "        unknown_rank: true\n",
      "      }\n",
      "    }\n",
      "  }\n",
      "}\n",
      "versions {\n",
      "  producer: 22\n",
      "}\n",
      "\n",
      "[name: \"a\"\n",
      "op: \"Placeholder\"\n",
      "attr {\n",
      "  key: \"dtype\"\n",
      "  value {\n",
      "    type: DT_FLOAT\n",
      "  }\n",
      "}\n",
      "attr {\n",
      "  key: \"shape\"\n",
      "  value {\n",
      "    shape {\n",
      "      unknown_rank: true\n",
      "    }\n",
      "  }\n",
      "}\n",
      ", name: \"b\"\n",
      "op: \"Placeholder\"\n",
      "attr {\n",
      "  key: \"dtype\"\n",
      "  value {\n",
      "    type: DT_FLOAT\n",
      "  }\n",
      "}\n",
      "attr {\n",
      "  key: \"shape\"\n",
      "  value {\n",
      "    shape {\n",
      "      unknown_rank: true\n",
      "    }\n",
      "  }\n",
      "}\n",
      "]\n",
      "[name: \"a\"\n",
      "op: \"Placeholder\"\n",
      "attr {\n",
      "  key: \"dtype\"\n",
      "  value {\n",
      "    type: DT_FLOAT\n",
      "  }\n",
      "}\n",
      "attr {\n",
      "  key: \"shape\"\n",
      "  value {\n",
      "    shape {\n",
      "      unknown_rank: true\n",
      "    }\n",
      "  }\n",
      "}\n",
      ", name: \"b\"\n",
      "op: \"Placeholder\"\n",
      "attr {\n",
      "  key: \"dtype\"\n",
      "  value {\n",
      "    type: DT_FLOAT\n",
      "  }\n",
      "}\n",
      "attr {\n",
      "  key: \"shape\"\n",
      "  value {\n",
      "    shape {\n",
      "      unknown_rank: true\n",
      "    }\n",
      "  }\n",
      "}\n",
      ", name: \"c\"\n",
      "op: \"Add\"\n",
      "input: \"a\"\n",
      "input: \"b\"\n",
      "attr {\n",
      "  key: \"T\"\n",
      "  value {\n",
      "    type: DT_FLOAT\n",
      "  }\n",
      "}\n",
      "]\n"
     ]
    }
   ],
   "source": [
    "# we show that node is append to the graph step by step.\n",
    "with tf.Graph().as_default() as new:\n",
    "    # add node a to graph\n",
    "    a = tf.placeholder(tf.float32,name='a')\n",
    "    print(new.as_graph_def())\n",
    "    # you can visualize it in tensorboard!\n",
    "    tf.summary.FileWriter('./add',new).close()\n",
    "    # add node b to graph\n",
    "    b = tf.placeholder(tf.float32,name='b')\n",
    "    print(new.as_graph_def().node)\n",
    "    # you can visualize it in tensorboard!\n",
    "    tf.summary.FileWriter('./add',new).close()\n",
    "    c = tf.add(a,b,name='c')\n",
    "    print(new.as_graph_def().node)\n",
    "    \n",
    "    "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "metadata": {},
   "outputs": [],
   "source": [
    "from graphviz import Digraph"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 60,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/svg+xml": [
       "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n",
       "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n",
       " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n",
       "<!-- Generated by graphviz version 2.36.0 (20140111.2315)\n",
       " -->\n",
       "<!-- Title: %3 Pages: 1 -->\n",
       "<svg width=\"134pt\" height=\"116pt\"\n",
       " viewBox=\"0.00 0.00 134.00 116.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n",
       "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 112)\">\n",
       "<title>%3</title>\n",
       "<polygon fill=\"white\" stroke=\"none\" points=\"-4,4 -4,-112 130,-112 130,4 -4,4\"/>\n",
       "<!-- a -->\n",
       "<g id=\"node1\" class=\"node\"><title>a</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-90\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"27\" y=\"-86.3\" font-family=\"Times,serif\" font-size=\"14.00\">a</text>\n",
       "</g>\n",
       "<!-- c -->\n",
       "<g id=\"node3\" class=\"node\"><title>c</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"63\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"63\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">c</text>\n",
       "</g>\n",
       "<!-- a&#45;&gt;c -->\n",
       "<g id=\"edge1\" class=\"edge\"><title>a&#45;&gt;c</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M35.3496,-72.7646C39.7115,-64.2831 45.1469,-53.7144 50.0413,-44.1974\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"53.2346,-45.6409 54.6957,-35.1473 47.0096,-42.4395 53.2346,-45.6409\"/>\n",
       "</g>\n",
       "<!-- b -->\n",
       "<g id=\"node2\" class=\"node\"><title>b</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"99\" cy=\"-90\" rx=\"27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"99\" y=\"-86.3\" font-family=\"Times,serif\" font-size=\"14.00\">b</text>\n",
       "</g>\n",
       "<!-- b&#45;&gt;c -->\n",
       "<g id=\"edge2\" class=\"edge\"><title>b&#45;&gt;c</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M90.6504,-72.7646C86.2885,-64.2831 80.8531,-53.7144 75.9587,-44.1974\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"78.9904,-42.4395 71.3043,-35.1473 72.7654,-45.6409 78.9904,-42.4395\"/>\n",
       "</g>\n",
       "</g>\n",
       "</svg>\n"
      ],
      "text/plain": [
       "<graphviz.dot.Digraph at 0x7f91163eea50>"
      ]
     },
     "execution_count": 60,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dot = Digraph()\n",
    "for n in new.as_graph_def().node:\n",
    "    dot.node(n.name,label=n.name)\n",
    "    for i  in n.input:\n",
    "        dot.edge(i,n.name)\n",
    "dot"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 2",
   "language": "python",
   "name": "python2"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
